/**
 * @file menu.h
 * @brief 菜单系统模块头文件
 */

#ifndef MENU_H
#define MENU_H

#include <Arduino.h>
#include "config.h"
#include "buttons.h"
#include "display.h"
#include "led.h"

/**
 * @brief 初始化菜单系统
 */
void initMenu();

/**
 * @brief 更新菜单状态
 */
void updateMenu();

/**
 * @brief 处理按钮输入
 */
void handleMenuInput();

/**
 * @brief 保存设置到EEPROM
 *
 * @return true 保存成功
 * @return false 保存失败
 */
bool saveSettings();

/**
 * @brief 从EEPROM加载设置
 *
 * @return true 加载成功
 * @return false 加载失败
 */
bool loadSettings();

/**
 * @brief 重置设置为默认值
 */
void resetSettings();

/**
 * @brief 获取当前选中的菜单项
 *
 * @return uint8_t 菜单项索引
 */
uint8_t getSelectedMenuItem();

/**
 * @brief 设置当前选中的菜单项
 *
 * @param item 菜单项索引
 */
void setSelectedMenuItem(uint8_t item);

/**
 * @brief 获取当前选中的效果
 *
 * @return EffectType 效果类型
 */
EffectType getSelectedEffect();

/**
 * @brief 设置当前选中的效果
 *
 * @param effect 效果类型
 */
void setSelectedEffect(EffectType effect);

/**
 * @brief 获取当前选中的颜色方案
 *
 * @return uint8_t 颜色方案索引
 */
uint8_t getSelectedColorScheme();

/**
 * @brief 设置当前选中的颜色方案
 *
 * @param scheme 颜色方案索引
 */
void setSelectedColorScheme(uint8_t scheme);

/**
 * @brief 获取当前亮度
 *
 * @return uint8_t 亮度值（0-255）
 */
uint8_t getCurrentBrightness();

/**
 * @brief 设置当前亮度
 *
 * @param brightness 亮度值（0-255）
 */
void setCurrentBrightness(uint8_t brightness);

/**
 * @brief 获取当前灵敏度
 *
 * @return uint8_t 灵敏度值（0-100）
 */
uint8_t getCurrentSensitivity();

/**
 * @brief 设置当前灵敏度
 *
 * @param sensitivity 灵敏度值（0-100）
 */
void setCurrentSensitivity(uint8_t sensitivity);

// 菜单页面显示函数
void showLedModePage(uint8_t mode);
void showSegmentsPage(uint8_t segments);
void showLedsPerSegmentPage(uint8_t leds);
void showStylePage(uint8_t style);
void showNoiseThresholdPage(uint8_t threshold);
void showNoiseCheckPage(bool enabled);

// LED效果控制函数声明
void setLedStripMode(LedStripMode mode);

// 别名函数
#define setAudioSensitivity setCurrentSensitivity
// ==================== 修复错误的别名定义 ====================
// 删除错误的setLedStripMode别名定义，因为它错误地指向了setCurrentBrightness
// setLedStripMode应该是一个独立的函数，在led_effects.cpp中定义

// 菜单滚动相关变量
extern uint8_t firstVisibleMenuItem;
extern const uint8_t VISIBLE_MENU_ITEMS;

// 二级菜单导航需要的常量
extern uint8_t firstVisibleCategory;
extern uint8_t firstVisibleItemInCategory;
extern uint8_t selectedCategory;
extern uint8_t selectedItemInCategory;

// 菜单分组枚举
enum MenuGroup
{
    GROUP_BASIC,
    GROUP_LED,
    GROUP_SPECTRUM,
    GROUP_PEAK,
    GROUP_AUDIO,
    GROUP_BEAT,
    GROUP_SAVE,
    GROUP_SYSTEM
};

// 菜单分类枚举，补充七彩和渐变
enum MenuCategory {
    MENU_BASIC = 0,
    MENU_LED = 1,
    MENU_SPECTRUM = 2,
    MENU_PEAK = 3,
    MENU_WINDOW = 4,
    MENU_AUDIO = 5,
    MENU_BEAT = 6,
    MENU_RAINBOW = 7,   // 七彩颜色
    MENU_GRADIENT = 8,  // 渐变颜色
    MENU_CATEGORY_COUNT = 9
};

// 一级菜单（分类菜单）结构
struct MenuCategory_t
{
    const char *title;
    uint8_t itemCount;
    uint8_t firstItemIndex;
};

// 简化的菜单项结构（用于二级菜单）
struct SimpleMenuItem
{
    const char *title;
    MenuCategory category;
};

// 二级菜单导航变量声明
extern uint8_t selectedCategory;
extern uint8_t selectedItemInCategory;
extern uint8_t firstVisibleCategory;
extern uint8_t firstVisibleItemInCategory;

// 一级菜单数组声明
extern const MenuCategory_t menuCategories[MENU_CATEGORY_COUNT];

// 重新组织的菜单项数组声明
extern SimpleMenuItem reorganizedMenuItems[];
extern const uint8_t TOTAL_REORGANIZED_MENU_ITEMS;

// 函数声明
void handleSpecificMenuItem(uint8_t itemIndex);
String getReorganizedMenuItemValue(uint8_t index);
void adjustParameter(uint8_t menuItemIndex, bool increase);

// 新增的配置保存相关函数声明
void markConfigForSave();
void checkDelayedSave();
void forceSaveConfig();
bool hasUnsavedChanges();

// 配置值指针获取函数声明
void *getConfigValuePtr(ConfigItem item);
bool isPercentageConfig(ConfigItem item);

#endif // MENU_H